import * as XLSX from 'xlsx'

/**
 * 导出工单数据到Excel
 * @param {Array} data - 工单数据数组
 * @param {String} filename - 文件名
 * @param {String} sheetName - 工作表名称
 */
export function exportWorkOrderToExcel(data, filename = '工单数据', sheetName = 'Sheet1') {
  // 定义列映射
  const columnMapping = {
    'ID': 'id',
    '标题': 'title',
    '流程': 'process_name',
    '当前状态': 'state_name',
    '当前处理人': 'principals',
    '优先级': 'priority_text',
    '是否结束': 'is_end_text',
    '创建人': 'creator_name',
    '创建时间': 'create_time'
  }

  // 处理数据，转换优先级和结束状态为文本
  const processedData = data.map(item => {
    const processed = { ...item }

    // 转换优先级
    switch (item.priority) {
      case 1:
        processed.priority_text = '一般'
        break
      case 2:
        processed.priority_text = '紧急'
        break
      case 3:
        processed.priority_text = '非常紧急'
        break
      default:
        processed.priority_text = '一般'
    }

    // 转换结束状态
    processed.is_end_text = item.is_end === 0 ? '否' : '是'

    return processed
  })

  // 创建工作表数据
  const wsData = []

  // 添加表头
  wsData.push(Object.keys(columnMapping))

  // 添加数据行
  processedData.forEach(item => {
    const row = []
    Object.values(columnMapping).forEach(key => {
      row.push(item[key] || '')
    })
    wsData.push(row)
  })

  // 创建工作表
  const ws = XLSX.utils.aoa_to_sheet(wsData)

  // 设置列宽
  const colWidths = [
    { wch: 10 }, // ID
    { wch: 30 }, // 标题
    { wch: 20 }, // 流程
    { wch: 15 }, // 当前状态
    { wch: 15 }, // 当前处理人
    { wch: 12 }, // 优先级
    { wch: 10 }, // 是否结束
    { wch: 15 }, // 创建人
    { wch: 20 } // 创建时间
  ]
  ws['!cols'] = colWidths

  // 创建工作簿
  const wb = XLSX.utils.book_new()
  XLSX.utils.book_append_sheet(wb, ws, sheetName)

  // 生成文件名（包含时间戳）
  const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')
  const finalFilename = `${filename}_${timestamp}.xlsx`

  // 导出文件
  XLSX.writeFile(wb, finalFilename)
}

/**
 * 获取所有工单数据用于导出
 * @param {Function} apiFunction - API调用函数
 * @param {Object} queryParams - 查询参数
 * @returns {Promise} 返回所有数据的Promise
 */
export async function getAllWorkOrderData(apiFunction, queryParams) {
  try {
    // 设置大的pageSize来获取全部数据
    const exportQueryParams = {
      ...queryParams,
      page: 1,
      per_page: 100000
    }
    const response = await apiFunction(exportQueryParams)

    // 根据不同的API响应结构处理数据
    if (response.data) {
      // 处理分页响应
      if (response.data.list) {
        return response.data.list
      }
      // 处理直接数组响应
      if (Array.isArray(response.data)) {
        return response.data
      }
      // 处理其他可能的数据结构
      if (response.data.data) {
        return response.data.data
      }
    }

    // 如果都不匹配，返回空数组
    console.warn('无法解析API响应数据结构:', response)
    return []
  } catch (error) {
    console.error('获取数据失败:', error)
    throw new Error('获取数据失败，请重试')
  }
}

/**
 * 导出积分历史数据到Excel
 * @param {Array} data - 积分历史数据数组
 * @param {String} filename - 文件名
 * @param {String} sheetName - 工作表名称
 */
export function exportPointsHistoryToExcel(data, filename = '积分历史记录', sheetName = 'Sheet1') {
  // 定义列映射
  const columnMapping = {
    'ID': 'id',
    '用户ID': 'user_id',
    '用户名称': 'user_name_display',
    '变更积分': 'points',
    '备注': 'reason',
    '创建时间': 'create_time'
  }

  // 处理数据，格式化积分显示
  const processedData = data.map(item => {
    const processed = { ...item }

    // 格式化积分显示
    if (processed.points > 0) {
      processed.points = `+${processed.points}`
    }

    // 处理用户名称显示（优先显示昵称，其次用户名）
    processed.user_name_display = processed.nick_name || processed.user_name || '-'

    // 格式化时间
    if (processed.create_time) {
      const date = new Date(processed.create_time)
      processed.create_time = date.toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      })
    }

    return processed
  })

  // 创建工作表数据
  const wsData = []

  // 添加表头
  wsData.push(Object.keys(columnMapping))

  // 添加数据行
  processedData.forEach(item => {
    const row = []
    Object.values(columnMapping).forEach(key => {
      row.push(item[key] || '')
    })
    wsData.push(row)
  })

  // 创建工作簿和工作表
  const wb = XLSX.utils.book_new()
  const ws = XLSX.utils.aoa_to_sheet(wsData)

  // 设置列宽
  const colWidths = [
    { wch: 8 }, // ID
    { wch: 12 }, // 用户ID
    { wch: 20 }, // 流程名称
    { wch: 12 }, // 工单ID
    { wch: 12 }, // 变更积分
    { wch: 30 }, // 备注
    { wch: 20 } // 创建时间
  ]
  ws['!cols'] = colWidths

  // 添加工作表到工作簿
  XLSX.utils.book_append_sheet(wb, ws, sheetName)

  // 导出文件
  XLSX.writeFile(wb, `${filename}.xlsx`)
}

/**
 * 获取所有积分历史数据
 * @param {Function} apiFunction - API函数
 * @param {Object} queryParams - 查询参数
 * @returns {Promise<Array>} 积分历史数据数组
 */
export async function getAllPointsHistoryData(apiFunction, queryParams) {
  try {
    // 设置大的pageSize来获取全部数据
    const exportQueryParams = {
      ...queryParams,
      page: 1,
      pageSize: 100000
    }

    const response = await apiFunction(exportQueryParams)

    // 根据不同的API响应结构处理数据
    if (response.data) {
      // 处理分页响应
      if (response.data.list) {
        return response.data.list
      }
      // 处理直接数组响应
      if (Array.isArray(response.data)) {
        return response.data
      }
      // 处理其他可能的数据结构
      if (response.data.data) {
        return response.data.data
      }
    }

    // 如果都不匹配，返回空数组
    console.warn('无法解析积分历史API响应数据结构:', response)
    return []
  } catch (error) {
    console.error('获取积分历史数据失败:', error)
    throw new Error('获取积分历史数据失败，请重试')
  }
}
